#include <QApplication>
#include <QFileDialog>
#include "file_manager.h"

#include "file_process.h"

File_manager::File_manager(QObject *parent)
    : QObject(parent)
    , file_process_(new File_process())
{

    init_connections();
}

File_manager::~File_manager()
{
    // 用户没有点击打开文件或拆分数据按钮，file_process_没有迁移到file_process_thread_线程中，需手动
    // 释放资源
    if (file_process_->thread() == thread()) {
        delete file_process_;
        file_process_ = nullptr;
    }

    file_process_thread_.quit();
    file_process_thread_.wait();
}

void File_manager::init_connections()
{
    // 打开对话框，选择要分解数据的文件列表
    connect(this, &File_manager::si_open_file_to_split_data,
            this, &File_manager::sl_open_file_to_split_data);

    // 打开对话框，选择要显示数据的文件列表
    connect(this, &File_manager::si_read_data_from_file,
            this, &File_manager::sl_read_data_from_file);

    // 打开日志文件，将文件数据根据不同类型查分到不同文件中
    connect(this, &File_manager::si_files_name_of_split_data,
            file_process_, &File_process::si_split_data_from_files);

    connect(this, &File_manager::si_files_name_of_readed_data,
            file_process_, &File_process::si_read_data_from_file);

    connect(file_process_, &File_process::si_send_data_to_model,
            this, &File_manager::si_send_track_to_model);

    connect(this, &File_manager::si_exit_,
            this, &File_manager::sl_exit_);
}

void File_manager::start_thread(QThread& thread, QObject *process)
{
    if ( !thread.isRunning()) {

        process->moveToThread(&thread);
        connect(&thread, &QThread::finished, process, &QObject::deleteLater);
        thread.start();
    }
}

void File_manager::sl_exit_()
{
    qApp->closeAllWindows();
}

void File_manager::sl_open_file_to_split_data()
{
    QStringList opened_files = QFileDialog::getOpenFileNames();

    if ( opened_files.isEmpty()) {
        return;
    }

    // 将处理文件数据对象迁入子线程，启动子线程
    start_thread(file_process_thread_, file_process_);

    emit si_files_name_of_split_data(opened_files);
}

void File_manager::sl_read_data_from_file()
{
    QStringList opened_files = QFileDialog::getOpenFileNames();

    if ( opened_files.isEmpty()) {
        return;
    }

    // 将处理文件数据对象迁入子线程，启动子线程
    start_thread(file_process_thread_, file_process_);

    emit si_files_name_of_readed_data(opened_files);
}
